#ifndef _HUFFMAN_H_ /* On vérifie si le fichier n'a pas déjà été inclus */
#define _HUFFMAN_H_

#define MAXCAR 256 // 256 caratere de la table acssi

/* Arbre de Huffman*/
typedef struct arbre_huff{
	unsigned char c; /* Caractère initial */
	unsigned int occurence; /* Nombre d'occurences dans le fichier */
	int code; /* Codage dans l'arbre */
	int bits; /* Nombre de bits sur lesquels est codée le caractère */
	struct arbre_huff *gauche, *droite; /* Lien vers les noeuds suivants */
};

/* Utilisé pour la création de l'arbre */
typedef struct temp_huff{
	struct arbre_huff *noeud[MAXCAR]; /* Lien vers les noeuds */
	int restant; /* Nombres de structures restante */
};

/* Informations necessaires à l'encodage du fihier */
typedef struct dictionaire{
	int code; /* Codage de Huffman du caract�re */
	unsigned int bits; /* Nombre de bits du codage */
};

int menu(void); /* Affichage du menu */

void compression(int choix);
void decompression(int choix);

void copier_fichier(char nomfich[]);
void compter_occ(unsigned int *carac, char nom[]); /* Compte les occurences pour la cr�ation du fichier frequence.txt */
void creer_freq(unsigned int arbreN[], char nom[]); /* Enregistrement dans le fichier frequence.txt */
struct arbre_huff * creer_arbre(unsigned int carac[]);
void ajouter_temp_huff(struct temp_huff *tmp, struct arbre_huff *arbre);
struct arbre_huff * nouveau_noeud(struct temp_huff *tmp);
void suppr_arbre (struct arbre_huff **arbre); /* Suppression d'un arbre binaire */
void creer_code(struct arbre_huff *arbre, int code, int niveau, struct dictionaire dico[]);
void ecrire_codage(struct dictionaire dico[], char nom[]);
unsigned int encodage(struct dictionaire dico[], char nom[]);
void ecrire_fichier(unsigned int carac[], char nom[], unsigned short int nbfich, unsigned int taille, short int mark);
int lire_index(unsigned int carac[], char nom[], int choix, short int *nbfich, short int mark);
void extraire_nom(char nom[], struct arbre_huff *arbre, int choix, int taille, unsigned int taille_fich, short int mark);
int decodage(char nom[],char *nomfich, struct arbre_huff *arbre, int taille, short int mark);
struct arbre_huff * convert_huff(struct arbre_huff *arbre, unsigned int buffer,unsigned int buffer_taille, unsigned int niveau);

#endif /* Fin du ifndef _HUFFMAN_H */
